import { fileGroupAdd, fileGroupDelete, fileGroupUpdate, fileCateLists, fileDelete, fileList, fileMove, fileRename } from '/@/api/admin/file'
import { usePaging } from './usePaging'
import { ElMessage, ElTree, type CheckboxValueType } from 'element-plus'
import { shallowRef, type Ref } from 'vue'
import { useMessageBox } from '/@/hooks/message'

// 左侧分组的钩子函数
export function useCate(type: number) {
	const treeRef = shallowRef<InstanceType<typeof ElTree>>()
	// 分组列表
	const cateLists = ref<any[]>([])

	// 选中的分组id
	const cateId = ref<number | string>('')

	// 获取分组列表
	const getCateLists = async () => {
		const { data } = await fileCateLists({
			type,
		})
		const item: any[] = [
			{
				name: '全部',
				id: '',
			},
			{
				name: '未分组',
				id: -1,
			},
		]
		cateLists.value = data
		cateLists.value?.unshift(...item)
		setTimeout(() => {
			treeRef.value?.setCurrentKey(cateId.value)
		}, 0)
	}

	// 添加分组
	const handleAddCate = async (value: string) => {
		await fileGroupAdd({
			type,
			name: value,
			pid: -1,
		})
		getCateLists()
	}

	// 编辑分组
	const handleEditCate = async (value: string, id: number) => {
		await fileGroupUpdate({
			id,
			name: value,
		})
		getCateLists()
	}

	// 删除分组
	const handleDeleteCate = async (id: number) => {
		try {
			await useMessageBox().confirm('确定要删除？')
		} catch (error) {
			return
		}
		await fileGroupDelete({ id })
		cateId.value = ''
		getCateLists()
	}

	//选中分类
	const handleCatSelect = (item: any) => {
		cateId.value = item.id
	}

	return {
		treeRef,
		cateId,
		cateLists,
		handleAddCate,
		handleEditCate,
		handleDeleteCate,
		getCateLists,
		handleCatSelect,
	}
}

// 处理文件的钩子函数
export function useFile(cateId: Ref<string | number>, type: Ref<number>, limit: Ref<number>, size: number) {
	const tableRef = shallowRef()
	const listShowType = ref('normal')
	const moveId = ref(-1)
	const select = ref<any[]>([])
	const isCheckAll = ref(false)
	const isIndeterminate = ref(false)
	const fileParams = reactive({
		original: '',
		type: type,
		groupId: cateId,
	})
	const { pager, getLists, resetPage } = usePaging({
		fetchFun: fileList,
		params: fileParams,
		firstLoading: true,
		size,
	})

	const getFileList = () => {
		getLists()
	}
	const refresh = () => {
		resetPage()
	}

	const isSelect = (id: number) => {
		return !!select.value.find((item: any) => item.id == id)
	}

	const batchFileDelete = async (id?: number[]) => {
		try {
			await useMessageBox().confirm('确认删除后本地将同步删除，如文件已被使用，请谨慎操作！')
		} catch {
			return
		}
		const ids = id ? id : select.value.map((item: any) => item.id)
		await fileDelete({ ids })
		getFileList()
		clearSelect()
	}

	const batchFileMove = async () => {
		const ids = select.value.map((item: any) => item.id)
		await fileMove({ ids, groupId: moveId.value })
		moveId.value = -1
		getFileList()
		clearSelect()
	}

	const selectFile = (item: any) => {
		const index = select.value.findIndex((items: any) => items.id == item.id)
		if (index != -1) {
			select.value.splice(index, 1)
			return
		}
		if (select.value.length == limit.value) {
			if (limit.value == 1) {
				select.value = []
				select.value.push(item)
				return
			}
			ElMessage.warning('已达到选择上限')
			return
		}
		select.value.push(item)
	}

	const clearSelect = () => {
		select.value = []
	}

	const cancelSelete = (id: number) => {
		select.value = select.value.filter((item: any) => item.id != id)
	}

	const selectAll = (value: CheckboxValueType) => {
		isIndeterminate.value = false
		tableRef.value?.toggleAllSelection()
		if (value) {
			select.value = [...pager.lists]
			return
		}
		clearSelect()
	}

	const handleFileRename = async (value: string, id: number) => {
		await fileRename({
			id,
			original: value,
		})
		getFileList()
	}
	return {
		listShowType,
		tableRef,
		moveId,
		pager,
		fileParams,
		select,
		isCheckAll,
		isIndeterminate,
		getFileList,
		refresh,
		batchFileDelete,
		batchFileMove,
		selectFile,
		isSelect,
		clearSelect,
		cancelSelete,
		selectAll,
		handleFileRename,
	}
}
